讓我們再繼續學習這碗美麗的湯使用方法吧~~
find
i1_tag = soup.find(id='i1')
print(i1_tag)
#輸出:<p class="contents" id="i1">456</p>
透過Tag與屬性更精準取值:
a_tag = soup.find('a', href = 'http://www.baidu.com')
print(a_tag)
#輸出:<a href="http://www.baidu.com">advertisements</a>
也有提供多引入正規表示法模組,不太了解正規表示法可參考這篇文章
import re
#取出開頭為http的連結
links = soup.find_all(href=re.compile("^http"))
print(links)
#輸出:[<a href="http://www.baidu.com">advertisements</a>]
在取用Html5一些新屬性時需要用特別的寫法如data-*
屬性:
html = '<div data-num="123">foo!</div>'
soup = BeautifulSoup(html, 'html.parser')
data_tag = soup.find(attrs={"data-num": "123"})
print(data_tag)
#輸出:<div data-num="123">foo!</div>
由於class是python 程式語言的保留字,所以Beautiful Soup改以class_
這個名稱代表 HTML 節點的class 屬性,一個 HTML標籤元素可以同時有多個CSS的class 屬性值,而我們在以class_
比對時,只要其中一個 class 符合就算比對成功如下範例
p_tag = soup.find_all("p", class_='news')
print(p_tag)
#輸出:[<p class="news">123</p>]
也可以使用select()
規則與CSS選擇器相同,id可用#
代表,class可用.
代表
a = soup.select('.news')
b = soup.select('#i1')
print(a)
print(b)
#輸出:[<p class="news">123</p>]
#輸出:[<p class="contents" id="i1">456</p>]
以link2_tag
為起始點
from bs4 import BeautifulSoup
html_doc = """
<body>
<a id="link0" href="/my_link0">Link 0</a>
<p class="my_par">
<a id="link1" href="/my_link1">Link 1</a>
<a id="link2" href="/my_link2">Link 2</a>
<a id="link3" href="/my_link3">Link 3</a>
<a id="link4" href="/my_link4">Link 4</a>
</p>
</body>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
link2_tag = soup.find(id="link2")
p_tag = link2_tag.find_parents("p")
print(p_tag)
#輸出:
[<p class="my_par">
<a href="/my_link1" id="link1">Link 1</a>
<a href="/my_link2" id="link2">Link 2</a>
<a href="/my_link3" id="link3">Link 3</a>
<a href="/my_link4" id="link4">Link 4</a>
</p>]
*
僅尋找同層元素
link_tag = link2_tag.find_next_siblings("a")
print(link_tag)
#輸出:
[<a href="/my_link3" id="link3">Link 3</a>, <a href="/my_link4" id="link4">Link 4</a>]
*
僅尋找同層元素
link_tag = link2_tag.find_previous_siblings("a")
print(link_tag)
#輸出:[<a href="/my_link1" id="link1">Link 1</a>]
get()
使用get()
函數取得節點屬性的值
html_doc = """
<body>
<a id="link0" href="/my_link0">Link 0</a>
<p class="my_par">
<a id="link1" href="/my_link1">Link 1</a>
<a id="link2" href="/my_link2">Link 2</a>
<a id="link3" href="/my_link3">Link 3</a>
<a id="link3" href="/my_link4">Link 4</a>
</p>
</body>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
a_tag = soup.select("#link3")
print(a_tag[0].get("href"))
#輸出: /my_link3
[]
直接使用[]
取得屬性值
a_tag = soup.select("#link3")
print(a_tag[0]["href"])
#輸出: /my_link3
attrs
會回傳此Tag可獲取的屬性,也可使用attrs[]
指定屬性獲取
print(soup.a.attrs)
#輸出: {'id': 'link0', 'href': '/my_link0'}
參考資料:https://hk.saowen.com/a/dbceb20617d08a888522e32258ce4e8244b4829f9589e5c3f433575c3e07b8a7
參考資料:https://blog.gtwang.org/programming/python-beautiful-soup-module-scrape-web-pages-tutorial/
參考資料:https://ithelp.ithome.com.tw/articles/10196817
文章內容如果有錯誤歡迎留言告知,可以幫忙糾正錯誤的觀念,感謝!